package com.util.orm.service.impl;

import com.util.common.QueryList;
import com.util.common.QueryParam;
import com.util.orm.dao.Dao;
import com.util.orm.service.BaseService;
import org.springframework.dao.DataAccessException;

import java.io.Serializable;
import java.util.List;

/**
 * 基本服务实现类
 * BaseServiceImpl
 * 2016年1月5日
 *
 * @param <E>
 * @param <PK>
 */
public class BaseServiceImpl<E, PK extends Serializable> implements BaseService<E,PK> {

	protected Dao<E,PK> baseDaoImpl;
	
	public Dao<E, PK> getBaseDaoImpl() {
		return baseDaoImpl;
	}

	public void setBaseDaoImpl(Dao<E, PK> baseDaoImpl) {
		this.baseDaoImpl = baseDaoImpl;
	}

	@Override
	public E getObjectById(PK id) throws DataAccessException {
		return getBaseDaoImpl().getByPk(id);
	}
	
	@Override
	public E getUniqueByParam(String sqlId,Serializable param) throws DataAccessException {
		return getBaseDaoImpl().selectOne(sqlId, param);
	}

	@Override
	public Long getCount(Object param) {
		return getBaseDaoImpl().getCount(param);
	}

	@Override
	public Long getCount(String sqlId, Object param) {
		return getBaseDaoImpl().getCount(sqlId, param);
	}

	@Override
	public int deleteObjectById(PK id) throws DataAccessException {
		return getBaseDaoImpl().deleteByPk(id);
	}

	@Override
	public int saveObject(E entity) throws DataAccessException {
		return getBaseDaoImpl().insert(entity);
	}


	@Override
	public int update(E entity) throws DataAccessException {
		return getBaseDaoImpl().update(entity);
	}
	
	@Override
	public int update(String sqlId ,E entity) throws DataAccessException{
		return getBaseDaoImpl().update(sqlId, entity);
	};

	@Override
	public List<E> selectList(Object param) {
		return getBaseDaoImpl().selectList(param);
	}

	@Override
	public List<E> selectList(String sqlId, Object param) {
		return getBaseDaoImpl().selectList(sqlId, param);
	}
	
	/**
	 * 分页查询, 指定可分页查询条件
	 * @return
	 */
	public QueryList<E> selectPage(QueryParam pageParam) {
		return getBaseDaoImpl().selectPage(pageParam);
	}
	
	/**
	 * 分页查询, 指定特定sqlId语句，指定可分页查询条件
	 * @param sqlId
	 * @param pageParam
	 * @param otherParam
	 * @return
	 */
	public QueryList<E> selectPage(String sqlId, QueryParam pageParam, Object otherParam) {
		return getBaseDaoImpl().selectPage(sqlId, pageParam, otherParam);
	}
	
	@Override
	public void startBatch() {
		getBaseDaoImpl().startBatch();
	}
	
	@Override
	public int flushBatch() {
		return getBaseDaoImpl().flushBatch();
	}
	
	@Override
	public void executeBatch() {
		getBaseDaoImpl().executeBatch();
	}
	
	@Override
	public void executeBatch(boolean commitTx) {
		getBaseDaoImpl().executeBatch(true);
	}
	/**
	 * 取消批量操作。如果commitTx为true则回滚事务。
	 * 此方法通常用户用户自己控制事务。
	 * @throws DataAccessException
	 */
	@Override
	public void cancelBatch() {
		getBaseDaoImpl().cancelBatch(false);
	}
	
	/**
	 * 取消批量操作。如果commitTx为true则回滚事务。
	 * 此方法通常用户用户自己控制事务。
	 * @throws DataAccessException
	 */
	@Override
	public void cancelBatch(boolean commitTx) {
		getBaseDaoImpl().cancelBatch(true);
	}
	
}
